#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
# @Time    : 2019/5/7 12:02
# @Author  : Leonis
# @Site    : 
# @File    : encrypt_algorithm.py
# @Software: PyCharm
# @Describe:  用于封装常用加密算法: MD5、SHA1 等; 对字符串 或 序列 进行加密.
"""

# Hash加密算法: md5, sha1, sha256, sha512 等算法
import hashlib


class EncryptAlgorithm:
    """ 用于封装常用的 Hash 加密算法"""

    @classmethod
    def with_md5(cls, item: str, encoding='utf-8'):
        """
        使用 md5 - hash 加密处理
        :param item    : 等待加密的字符串
        :param encoding: 对 item 进行编码成 byte 类型. 默认: utf-8
        """
        if isinstance(item, str):
            # MD5 加密对象
            md5 = hashlib.md5()
            md5.update(item.encode(encoding=encoding))
            # 加密处理
            return md5.hexdigest()
        else:
            # 非 str 类型, 则直接返回 None
            return None

    @classmethod
    def with_sha1(cls, item: str, encoding='utf-8'):
        """
        使用 sha1 - hash 加密处理
        :param item    : 等待加密的字符串
        :param encoding: 对 item 进行编码成 byte 类型. 默认: utf-8
        :return: 加密之后的字符串
        """
        if isinstance(item, str):
            # MD5 加密对象
            sha1 = hashlib.sha1()
            sha1.update(item.encode(encoding=encoding))
            # 加密处理
            return sha1.hexdigest()
        else:
            # 非 str 类型, 则直接返回 None
            return None

    @classmethod
    def multi_encrypt(cls, sequence: tuple, algorithm="md5"):
        """
        批量 对序列进行加密
        :param sequence : 等待加密序列, 默认元组.
        :param algorithm: 加密算法, 默认: md5. 可选: md5, sha1 等
        :return:
        """

        # 收集加密后的item
        container = list()

        if not sequence:
            # 若序列为 空元组
            return None
        else:
            # 若序列不为空, 则进行加密
            if algorithm == 'md5':
                for item in sequence:
                    encrypt_item = cls.with_md5(item)
                    container.append(encrypt_item)
            elif algorithm == 'sha1':
                for item in sequence:
                    encrypt_item = cls.with_sha1(item)
                    container.append(encrypt_item)
            else:
                raise ValueError('输入加密算法参数 algorithm: %s 未进行封装.' % algorithm)

        return container
